﻿using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Windows;
using System.Windows.Input;
using personalplaner.business.extensions;
using personalplaner.business.stamm;
using personalplaner.common.mvvm;
using personalplaner.common.mvvm.commands;
using personalplaner.common.mvvm.common;
using personalplaner.servicemodel.dataaccess;
using personalplaner.gui.common;
using personalplaner.business;


namespace personalplaner.gui.stamm.viewmodels
{
	public class FeiertageStammViewModel : BaseViewModel
    {
		public FeiertageStammViewModel(DependencyObject parent)
            : base(parent)
        {
        }

		public override void Loaded()
		{
            var da = GetService<ICommonDataAccess>();
            SelectedYear = da.GetActiveJahr();
			SelectedFeiertag = null;

			var mw = GetService<IMainWindowDisplayContainer>();
			mw.IsWaitVisible = false;
		}

        #region Commands

        ICommand _okcommand;
        public ICommand OkCommand
        {
            get
            {
                if (_okcommand == null)
                    _okcommand = new RelayCommand(OnOkCommand);
                return _okcommand;
            }
        }

        private void OnOkCommand(object parameter)
        {
        	var wnd = Parent as Window;
			if (wnd != null)
			{
				wnd.DialogResult = true;
				wnd.Close();
				return;
			}

			var mw = GetService<IMainWindowDisplayContainer>();
			mw.MoveToPreviousView();
        }

        ICommand _cancelcommand;
        public ICommand CancelCommand
        {
            get
            {
                if (_cancelcommand == null)
                    _cancelcommand = new RelayCommand(OnCancelCommand);
                return _cancelcommand;
            }
        }

        private void OnCancelCommand(object parameter)
        {
			var wnd = Parent as Window;
			if (wnd != null)
			{
				wnd.DialogResult = false;
				wnd.Close();
				return;
			}

			var mw = GetService<IMainWindowDisplayContainer>();
			mw.MoveToPreviousView();
        }

		ICommand _savecommand;
		public ICommand SaveCommand
		{
			get
			{
				if (_savecommand == null)
					_savecommand = new RelayCommand(OnSave, parameter => SelectedFeiertag != null && SelectedFeiertag.IsValid && !string.IsNullOrEmpty(SelectedFeiertag.Name) && SelectedFeiertag.Tage > 0);
				return _savecommand;
			}
		}

		private void OnSave(object parameter)
		{
			var da = GetService<ICommonDataAccess>();
			if (SelectedFeiertag.IsNew)
			{
                if (SelectedFeiertag.Von.Year != SelectedYear)
                {
                    MessageBox.Show(personalplaner.gui.Properties.Resources.DateNotInSelectedYear,Properties.Resources.Error, MessageBoxButton.OK, MessageBoxImage.Error);
                    return;
                }

				var atid = da.SaveFeiertag(SelectedFeiertag);
				SelectedFeiertag.ID = atid;
				SelectedFeiertag.AtId = atid;
				Feiertage.Add(SelectedFeiertag);
			}
			else
				da.UpdateFeiertag(SelectedFeiertag);

		}

        ICommand _deleteCommand;
        public ICommand DeleteCommand
        {
            get
            {
                if (_deleteCommand == null)
                    _deleteCommand = new RelayCommand(OnDelete, param => SelectedFeiertag != null && !SelectedFeiertag.IsNew);
                return _deleteCommand;
            }
        }

        private void OnDelete(object parameter)
        {
            var da = GetService<ICommonDataAccess>();
            if (!da.DelFeiertag(SelectedFeiertag.AtId))
            {
                MessageBox.Show(Properties.Resources.ErrorWhileDeletingFeiertag, Properties.Resources.Error, MessageBoxButton.OK, MessageBoxImage.Error);
                return;
            }

            Feiertage.Remove(SelectedFeiertag);
            SelectedFeiertag = null;
        }

		ICommand _newcommand;
		public ICommand NewCommand
		{
			get
			{
				if (_newcommand == null)
					_newcommand = new RelayCommand(OnNew);
				return _newcommand;
			}
		}

		private void OnNew(object parameter)
		{
			SelectedFeiertag = new Feiertag();

            SelectedFeiertag.Von = DateTime.Today;
            SelectedFeiertag.Bis = DateTime.Today;

			RaiseMoveFocus("Name");
		}

		#endregion

        #region Properties

		IList<int> _years;
		public IList<int> Years
		{
			get
			{
				if (_years == null)
				{
                    var da = GetService<ICommonDataAccess>();
                    var now = da.GetActiveJahr();

					_years = new List<int>();
					for (int y = (now - 5); y < (now + 8); y++)
					{
						_years.Add(y);
					}
					//SelectedYear = DateTime.Now.Year;
				}
				return _years;
			}
		}

		int _selectedYear;
		public int SelectedYear
		{
			get
			{
				return _selectedYear;
			}
			set
			{
				_selectedYear = value;
				RaisePropertyChanged("SelectedYear");


				var da = GetService<ICommonDataAccess>();
				var lst = da.GetFeiertage(SelectedYear);
				Feiertage.Clear();
				if (lst != null)
					foreach (var itm in lst)
						Feiertage.Add(itm);
			}
		}

		IList<Feiertag> _feiertage;
		public IList<Feiertag> Feiertage
		{
			get
			{
				if (_feiertage == null)
					_feiertage = new ObservableCollection<Feiertag>();
				
				return _feiertage;
			}
		}

		Feiertag _selectedFeiertag;
		public Feiertag SelectedFeiertag
		{
			get { return _selectedFeiertag; }
			set
			{
				_selectedFeiertag = value;
				RaisePropertyChanged("SelectedFeiertag");

				RaisePropertyChanged("IsFeiertagSelected");
			}
		}

		public bool IsFeiertagSelected
		{
			get
			{
				return SelectedFeiertag != null;
			}
		}

		#endregion
    }
}
